home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BCI NET
/
BCI NET Dec 94.iso
/
archives
/
programming
/
source
/
propgadget.lha
/
PropGadget
/
div.asm
< prev
next >
Wrap
Assembly Source File
|
1989-11-30
|
2KB
|
64 lines
; An ill-favored thing, sir, but my own.
; It is easier to be critical than correct. Disraeli
;
; Jerry J. Trantow
; 1560 A East Irving Place
; Milwaukee, Wi 53202-1460
; written especially for Gadget calculation where result is always 32 bits
; 12 Jan 89 Now does a 64/32 with a 64 bit result
; 12 Jan 89 64 bit Quotient gets returned in the Dividend
; 14 Jan 89 passes divisor by value
; 15 Jan 89 Used Andi, ori to set X Flag
; 24 Jan 89 Division by 2^31 or larger doesn't seem to work
; 1 Feb 89 Implemented a 64/32 = 32 bit Quotient Division
; NOTE : ONLY USE THE LOWER ULONG i.e. ONLY A 32 bit Quotient
;
IFD LATTICE
CSECT text
XDEF _QuadDiv68000
ELSE
public _QuadDiv68000
ENDC
_QuadDiv68000:
link a5,#0
movem.l d2/d3/d5,-(sp) ; push registers on the stack
move.l 8(a5),a0 ; Points to Dividend (64 bits)
move.l 4(a0),d1 ; lower 32 of Dividend
move.l (a0),d0 ; upper 32 of Dividend
move.l 12(a5),d2 ; 32 bit divisor
move.l #64,d5 ; counter for 64 bit operation
clr.l d3 ; clear the test LONG WORD
asl.l #1,d1 ; move a bit into the test position
roxl.l #1,d0
roxl.l #1,d3
_divide cmp.l d2,d3 ; is dividend > divisor
blt _smallr
_largr sub.l d2,d3 ; dividend-=divisor
ori.b #16,CCR ; Q0=1 (X Flag)
bra _shift
_smallr andi.b #15,CCR ; Q0=0 (X Flag)
_shift roxl.l #1,d1 ; shift Quotient into dividend
roxl.l #1,d0 ; shift Dividend into test position
roxl.l #1,d3
subi.l #1,d5 ; decrement the counter
bne _divide
move.l d0,(a0) ; put the Quotient where it belongs
move.l d1,4(a0)
.007 movem.l (sp)+,d2/d3/d5
unlk a5
rts
end